Racial Wealth Gap

Synopsis

Problem: The wealth gap between Whites and BIPOC is astoundingly wide. There are multitude of potential contributing factors. The goal of this report is to explore the data to identify trends and relationships.


Packages Required:

library(tidyverse)
library(knitr)
library(kableExtra)
library(scales)
library(plotly)
library(xfun)

Data Preparation

Data Import

The 10 datasets originally pulled from the Urban Institute and US Census.

Retrievable from this Github Repo.

lifetime_earn <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/lifetime_earn.csv')
student_debt <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/student_debt.csv')
retirement <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/retirement.csv')
home_owner <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/home_owner.csv')
race_wealth <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/race_wealth.csv')
income_time <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_time.csv')
income_limits <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_limits.csv')
income_aggregate <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_aggregate.csv')
income_distribution <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_distribution.csv')
income_mean <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-02-09/income_mean.csv')

Data Dictionary

lifetime_earn.csv (Source:):

Average lifetime earning by race/gender

Variable Name Data Class Description
gender character gender column
race character Racial group
lifetime_earn numeric Lifetime earnings

student_dept.csv (Source):

Average family student load debt for aged 25-55, by race and year normalized to 2016 dollars.

Variable Name Data Class Description
year numeric Year of measure
race character Racial group
loan_debt numeric Loan dept
loan_debt_pct numeric Share of families with student loan dept

retirement.csv (Source):

Average family liquid retirement savings normalized to 2016 dollars.

Variable Name Data Class Description
year numeric Year
race character Racial group
retirement numeric Retirement dollars

home_owner.csv (Source):

Home ownership percentage for families.

Variable Name Data Class Description
year numeric Year
race character Racial group
home_owner_pct numeric Home ownership by race/ethnicity

race_wealth.csv (Source):
Family wealth by race/year/measure normalized to 2016, with measures of central tendency with mean and median.

Variable Name Data Class Description
type character Type of measure, either median or mean
year numeric Year
race character Racial group
wealth_family numeric Family wealth

income_time.csv (Source):
Family-level income by percentile and year.

Variable Name Data Class Description
year numeric Year
percentile character Income percentile (10th, 50th, 90th)
income_family numeric Familial income

income_limits.csv (Source):
Familial income limits for each fifth and top 5% of households by year and race.

Variable Name Data Class Description
year numeric Year
race character Racial group
dollar_type character Dollars in that year or normalized to 2019
number numeric Number of households by racial group
income_quintile character Income quintile as well as top 5%
income_dollars numeric Income in US dollars, specific to dollar type

income_aggregate.csv (Source):
Share of aggregate income received by each fifth and top 5% of each racial group/household.

Variable Name Data Class Description
year numeric Year
race character Racial group
number numeric Number of households by racial group
income_quintile character Income quintile and/or top 5%
income_share numeric Income share as a percentage

income_distribution.csv (Source):
Households by total money income, race, and hispanic origin of householder separated by year and income groups.

Variable Name Data Class Description
year numeric Year
race character Racial group
number numeric Number of households
income_median numeric Income median
income_med_moe numeric Income median margin of error
income_mean numeric Income mean
income_mean_moe numeric Income mean margin of error
income_bracket character Income bracket (9 total brackets between <$15,000 and >$200,000
income_distribution numeric Income distribution as the percentage of each year/racial group - should add up to 100 for a specific year and race

income_mean.csv (Source):
Mean income received by each fifth and top 5% of each racial group.

Variable Name Data Class Description
year numeric Year
race character Racial group
dollar_type character Dollar type, i.e. dollar relative to that year or normalized to 2019
income_quintile character Income quintile and/or top 5%
income_dollars numeric Income dollar average

Exploratory Data Analysis (EDA)

Family Wealth Analysis

Average family wealth (1963-2016)
Family wealth a a family’s assets (i.e., savings, real estate, businesses) minus debt.

In 1963, the average wealth of white families was $121,129, which is 6.2 times greater than the average wealth of non-white families of $19,503. In 2016, White average wealth of $919,336 was 6.6 times greater than Black average wealth of $139,523.

Median family wealth (1963-2016)
Average family wealth is more influenced by very rich families and does not represent the “typical” experience. Median wealth—or the wealth of the household at the middle of a distribution—gives the experience of the typical family.

In 1963, the median of white family wealth was $47,654 which is 19.3 times greater than the median of non-white family wealth. White median family wealth was $171,000 in 2016, which is 9.8 times greater than Black median family wealth of $17,409. While the median wealth gap has lessened from 1963 to 2016, and is less than the average family wealth gap, the gap trends has shown to be consistent over time and the disparities remain significant.

Income Analysis

Lifetime Earnings
Those with lesser incomes might find it more difficult to save.

The average lifetime income of a white male is $2.7 million, compared to $1.8 million for black men and $2.0 million for Hispanic men. For women, the disparity in lifetime earnings is less pronounced: the average white woman makes $1.5 million, compared to $1.3 million for black women and $1.1 million for Hispanic women. Part of these differences can be attributed to historical disadvantages that still have an impact on future generations.

LS0tCnRpdGxlOiAiUHJvamVjdCIKZGF0ZTogIkxhc3QgY29tcGlsZWQgb246IGByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZXZhbCA9IFRSVUUsCiAgZWNobyA9IEZBTFNFLAogIG1lc3NhZ2UgPSBGQUxTRQogICkKCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHhmdW4pCmxpYnJhcnkodGlkeXZlcnNlKQoKcGtnX2xvYWQyKGMoImh0bWx0b29scyIsICJtaW1lIikpCgpzb3VyY2UoInNjcmlwdHMvcndfZGF0YXNldHMuUiIsIGxvY2FsID0ga25pdF9nbG9iYWwoKSkKc291cmNlKCJzY3JpcHRzL3J3X2RhdGFzZXRzX2Rlc2MuUiIsIGxvY2FsID0ga25pdF9nbG9iYWwoKSkKc291cmNlKCJ0aGVtZS9teV9zd2RfdGhlbWUuUiIpCmBgYAojIyBSYWNpYWwgV2VhbHRoIEdhcCB7LnRhYnNldH0KCiMjIyAqKlN5bm9wc2lzKioKCioqUHJvYmxlbToqKgpUaGUgd2VhbHRoIGdhcCBiZXR3ZWVuIFdoaXRlcyBhbmQgQklQT0MgaXMgYXN0b3VuZGluZ2x5IHdpZGUuIFRoZXJlIGFyZSBtdWx0aXR1ZGUgb2YgcG90ZW50aWFsIGNvbnRyaWJ1dGluZyBmYWN0b3JzLiBUaGUgZ29hbCBvZiB0aGlzIHJlcG9ydCBpcyB0byBleHBsb3JlIHRoZSBkYXRhIHRvIGlkZW50aWZ5IHRyZW5kcyBhbmQgcmVsYXRpb25zaGlwcy4KCi0tLS0tLS0tLS0tLQoKKipQYWNrYWdlcyBSZXF1aXJlZDoqKgpgYGAKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHhmdW4pCmBgYAotLS0tLS0tLS0tLS0tCgojIyMgRGF0YSBQcmVwYXJhdGlvbiB7LnRhYnNldH0KCiMjIyMgRGF0YSBJbXBvcnQKVGhlIDEwIGRhdGFzZXRzIG9yaWdpbmFsbHkgcHVsbGVkIGZyb20gdGhlIFtVcmJhbiBJbnN0aXR1dGVdKGh0dHBzOi8vYXBwcy51cmJhbi5vcmcvZmVhdHVyZXMvd2VhbHRoLWluZXF1YWxpdHktY2hhcnRzLykgYW5kIFtVUyBDZW5zdXNdKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZGF0YS90YWJsZXMvdGltZS1zZXJpZXMvZGVtby9pbmNvbWUtcG92ZXJ0eS9oaXN0b3JpY2FsLWluY29tZS1ob3VzZWhvbGRzLmh0bWwpLiAgCgpSZXRyaWV2YWJsZSBmcm9tIHRoaXMgW0dpdGh1YiBSZXBvXShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L3RyZWUvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5KS4gIAo8aHI+CgpgYGAKbGlmZXRpbWVfZWFybiA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2xpZmV0aW1lX2Vhcm4uY3N2JykKYGBgCmBgYApzdHVkZW50X2RlYnQgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9zdHVkZW50X2RlYnQuY3N2JykKYGBgCmBgYApyZXRpcmVtZW50IDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMDkvcmV0aXJlbWVudC5jc3YnKQpgYGAKYGBgCmhvbWVfb3duZXIgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9ob21lX293bmVyLmNzdicpCmBgYApgYGAKcmFjZV93ZWFsdGggPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9yYWNlX3dlYWx0aC5jc3YnKQpgYGAKYGBgCmluY29tZV90aW1lIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMDkvaW5jb21lX3RpbWUuY3N2JykKYGBgCmBgYAppbmNvbWVfbGltaXRzIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMDkvaW5jb21lX2xpbWl0cy5jc3YnKQpgYGAKYGBgCmluY29tZV9hZ2dyZWdhdGUgPC0gcmVhZHI6OnJlYWRfY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9pbmNvbWVfYWdncmVnYXRlLmNzdicpCmBgYApgYGAKaW5jb21lX2Rpc3RyaWJ1dGlvbiA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2luY29tZV9kaXN0cmlidXRpb24uY3N2JykKYGBgCmBgYAppbmNvbWVfbWVhbiA8LSByZWFkcjo6cmVhZF9jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2luY29tZV9tZWFuLmNzdicpCmBgYAoKIyMjIyBEYXRhIERpY3Rpb25hcnkKCgoKYGxpZmV0aW1lX2Vhcm4uY3N2YCAoW1NvdXJjZTpdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2xpZmV0aW1lX2Vhcm4uY3N2KSk6CgpBdmVyYWdlIGxpZmV0aW1lIGVhcm5pbmcgYnkgcmFjZS9nZW5kZXIKCmBgYHtyfQprYWJsZShkYXRhMS5kZXNjKQpgYGAKKioqCgpgc3R1ZGVudF9kZXB0LmNzdmAgKFtTb3VyY2VdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L3N0dWRlbnRfZGVidC5jc3YpKToKCkF2ZXJhZ2UgZmFtaWx5IHN0dWRlbnQgbG9hZCBkZWJ0IGZvciBhZ2VkIDI1LTU1LCBieSByYWNlIGFuZCB5ZWFyIG5vcm1hbGl6ZWQgdG8gMjAxNiBkb2xsYXJzLiAgCgpgYGB7cn0Ka2FibGUoZGF0YTIuZGVzYykKYGBgCioqKgoKYHJldGlyZW1lbnQuY3N2YCAoW1NvdXJjZV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMDkvcmV0aXJlbWVudC5jc3YpKToKCkF2ZXJhZ2UgZmFtaWx5IGxpcXVpZCByZXRpcmVtZW50IHNhdmluZ3Mgbm9ybWFsaXplZCB0byAyMDE2IGRvbGxhcnMuCgpgYGB7cn0Ka2FibGUoZGF0YTMuZGVzYykKYGBgCioqKgoKYGhvbWVfb3duZXIuY3N2YCAoW1NvdXJjZV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMDkvaG9tZV9vd25lci5jc3YpKToKCkhvbWUgb3duZXJzaGlwIHBlcmNlbnRhZ2UgZm9yIGZhbWlsaWVzLgoKYGBge3J9CmthYmxlKGRhdGE0LmRlc2MpCmBgYAoqKioKCmByYWNlX3dlYWx0aC5jc3ZgIChbU291cmNlXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9yYWNlX3dlYWx0aC5jc3YpKTogIApGYW1pbHkgd2VhbHRoIGJ5IHJhY2UveWVhci9tZWFzdXJlIG5vcm1hbGl6ZWQgdG8gMjAxNiwgd2l0aCBtZWFzdXJlcyBvZiBjZW50cmFsIHRlbmRlbmN5IHdpdGggbWVhbiBhbmQgbWVkaWFuLgoKYGBge3J9CmthYmxlKGRhdGE1LmRlc2MpCmBgYAoqKioKCmBpbmNvbWVfdGltZS5jc3ZgIChbU291cmNlXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L21hc3Rlci9kYXRhLzIwMjEvMjAyMS0wMi0wOS9pbmNvbWVfdGltZS5jc3YpKTogIApGYW1pbHktbGV2ZWwgaW5jb21lIGJ5IHBlcmNlbnRpbGUgYW5kIHllYXIuCgpgYGB7cn0Ka2FibGUoZGF0YTYuZGVzYykKYGBgCioqKgoKYGluY29tZV9saW1pdHMuY3N2YCAoW1NvdXJjZV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIxLzIwMjEtMDItMDkvaW5jb21lX2xpbWl0cy5jc3YpKTogIApGYW1pbGlhbCBpbmNvbWUgbGltaXRzIGZvciBlYWNoIGZpZnRoIGFuZCB0b3AgNSUgb2YgaG91c2Vob2xkcyBieSB5ZWFyIGFuZCByYWNlLgoKYGBge3J9CmthYmxlKGRhdGE3LmRlc2MpCmBgYAoqKioKCmBpbmNvbWVfYWdncmVnYXRlLmNzdmAgKFtTb3VyY2VdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2luY29tZV9hZ2dyZWdhdGUuY3N2KSk6ICAKU2hhcmUgb2YgYWdncmVnYXRlIGluY29tZSByZWNlaXZlZCBieSBlYWNoIGZpZnRoIGFuZCB0b3AgNSUgb2YgZWFjaCByYWNpYWwgZ3JvdXAvaG91c2Vob2xkLgoKYGBge3J9CmthYmxlKGRhdGE4LmRlc2MpCmBgYAoqKioKCmBpbmNvbWVfZGlzdHJpYnV0aW9uLmNzdmAgKFtTb3VyY2VdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2luY29tZV9kaXN0cmlidXRpb24uY3N2KSk6ICAKSG91c2Vob2xkcyBieSB0b3RhbCBtb25leSBpbmNvbWUsIHJhY2UsIGFuZCBoaXNwYW5pYyBvcmlnaW4gb2YgaG91c2Vob2xkZXIgc2VwYXJhdGVkIGJ5IHllYXIgYW5kIGluY29tZSBncm91cHMuCgpgYGB7cn0Ka2FibGUoZGF0YTkuZGVzYykKYGBgCioqKgoKYGluY29tZV9tZWFuLmNzdmAgKFtTb3VyY2VdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAyMS8yMDIxLTAyLTA5L2luY29tZV9tZWFuLmNzdikpOiAgCk1lYW4gaW5jb21lIHJlY2VpdmVkIGJ5IGVhY2ggZmlmdGggYW5kIHRvcCA1JSBvZiBlYWNoIHJhY2lhbCBncm91cC4KCmBgYHtyfQprYWJsZShkYXRhMTAuZGVzYykKYGBgCgojIyMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyAoRURBKSB7LnRhYnNldH0KCiMjIyMgRmFtaWx5IFdlYWx0aCBBbmFseXNpcwoKKipBdmVyYWdlIGZhbWlseSB3ZWFsdGggKDE5NjMtMjAxNikqKiAgCkZhbWlseSB3ZWFsdGggYSBhIGZhbWlseSdzIGFzc2V0cyAoaS5lLiwgc2F2aW5ncywgcmVhbCBlc3RhdGUsIGJ1c2luZXNzZXMpIG1pbnVzIGRlYnQuIAoKYGBge3J9CnJhY2VfbWVhbl90aW1lIDwtIHJhY2Vfd2VhbHRoIHw+IAogIGZpbHRlcih0eXBlID09ICJBdmVyYWdlIikgfD4gIyBmaWx0ZXIgYnkgYXZlcmFnZS9tZWFuIHdlYWx0aCAob3RoZXIgb3B0aW9uIGlzIGJ5IG1lZGlhbikKICBncm91cF9ieSh5ZWFyLCByYWNlKSB8PiAKICBzdW1tYXJpc2Uod2VhbHRoX2ZhbWlseSA9IHdlYWx0aF9mYW1pbHkpIAoKcndfbWVhbl90aW1lX3Bsb3QgPC0gZ2dwbG90KHJhY2VfbWVhbl90aW1lLCBhZXMoeCA9IHllYXIsIHkgPSB3ZWFsdGhfZmFtaWx5LCBjb2xvciA9IHJhY2UpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IC41KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA5NTAwMDApLCBicmVha3MgPSBzZXEoMCwgOTUwMDAwLCAxNTAwMDApLCBsYWJlbHMgPSBsYWJlbF9kb2xsYXIoKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJBdmVyYWdlIGZhbWlseSB3ZWFsdGggb3ZlciB0aW1lLCBieSByYWNlIiwKICAgIHggPSAiWWVhciIsCiAgICB5ID0gIkZhbWlseSBXZWFsdGgiLAogICkgKwogIG15X3N3ZF90aGVtZSgpICsgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICApCgpnZ3Bsb3RseShyd19tZWFuX3RpbWVfcGxvdCkgfD4gCiAgbGF5b3V0KAogICAgbGVnZW5kID0gbGlzdCggIyB0aGUgb3JpZW50YXRpb24gPSAiaCIgYXJnIGZpeGVzIHRoZSBsZWdlbmQgcG9zaXRpb24gInRvcCIgaXNzdWUKICAgICAgb3JpZW50YXRpb24gPSAiaCIsIAogICAgICB4ID0gLjA1LCAKICAgICAgeSA9IDEuMDQsCiAgICAgIHRpdGxlID0gbGlzdCgKICAgICAgICB0ZXh0ID0gIiIKICAgICAgKQogICAgICApCiAgKQpgYGAKCkluIDE5NjMsIHRoZSBhdmVyYWdlIHdlYWx0aCBvZiB3aGl0ZSBmYW1pbGllcyB3YXMgXCQxMjEsMTI5LCB3aGljaCBpcyAqKjYuMiB0aW1lcyoqIGdyZWF0ZXIgdGhhbiB0aGUgYXZlcmFnZSB3ZWFsdGggb2Ygbm9uLXdoaXRlIGZhbWlsaWVzIG9mIFwkMTksNTAzLiBJbiAyMDE2LCBXaGl0ZSBhdmVyYWdlIHdlYWx0aCBvZiBcJDkxOSwzMzYgd2FzICoqNi42IHRpbWVzKiogZ3JlYXRlciB0aGFuIEJsYWNrIGF2ZXJhZ2Ugd2VhbHRoIG9mICQxMzksNTIzLiAgCgoKCioqTWVkaWFuIGZhbWlseSB3ZWFsdGggKDE5NjMtMjAxNikqKiAgCkF2ZXJhZ2UgZmFtaWx5IHdlYWx0aCBpcyBtb3JlIGluZmx1ZW5jZWQgYnkgdmVyeSByaWNoIGZhbWlsaWVzIGFuZCBkb2VzIG5vdCByZXByZXNlbnQgdGhlICJ0eXBpY2FsIiBleHBlcmllbmNlLiBNZWRpYW4gd2VhbHRo4oCUb3IgdGhlIHdlYWx0aCBvZiB0aGUgaG91c2Vob2xkIGF0IHRoZSBtaWRkbGUgb2YgYSBkaXN0cmlidXRpb27igJRnaXZlcyB0aGUgZXhwZXJpZW5jZSBvZiB0aGUgdHlwaWNhbCBmYW1pbHkuIAoKYGBge3J9CnJhY2VfbWVkaWFuX3RpbWUgPC0gcmFjZV93ZWFsdGggfD4gCiAgZmlsdGVyKHR5cGUgPT0gIk1lZGlhbiIpIHw+ICMgZmlsdGVyIGJ5IG1lZGlhbiB3ZWFsdGggKG90aGVyIG9wdGlvbiBpcyBieSBhdmVyYWdlKQogIGdyb3VwX2J5KHllYXIsIHJhY2UpIHw+IAogIG11dGF0ZShyYWNlID0gYXNfZmFjdG9yKHJhY2UpKSB8PiAKICBzdW1tYXJpc2Uod2VhbHRoX2ZhbWlseSA9IHdlYWx0aF9mYW1pbHkpIAoKcndfbWVkaWFuX3RpbWVfcGxvdCA8LSBnZ3Bsb3QocmFjZV9tZWRpYW5fdGltZSwgYWVzKHggPSB5ZWFyLCB5ID0gd2VhbHRoX2ZhbWlseSwgY29sb3IgPSByYWNlKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KHNpemUgPSAuNSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMjAwMDAwKSwgYnJlYWtzID0gc2VxKDAsIDIwMDAwMCwgNTAwMDApLCBsYWJlbHMgPSBsYWJlbF9kb2xsYXIoKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJNZWRpYW4gZmFtaWx5IHdlYWx0aCBvdmVyIHRpbWUsIGJ5IHJhY2UiLAogICAgeCA9ICJZZWFyIiwKICAgIHkgPSAiRmFtaWx5IFdlYWx0aCIsCiAgKSArCiAgbXlfc3dkX3RoZW1lKCkgKyB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICkKZ2dwbG90bHkocndfbWVkaWFuX3RpbWVfcGxvdCkgfD4gCiAgbGF5b3V0KAogICAgbGVnZW5kID0gbGlzdCggIyB0aGUgb3JpZW50YXRpb24gPSAiaCIgYXJnIGZpeGVzIHRoZSBsZWdlbmQgcG9zaXRpb24gInRvcCIgaXNzdWUKICAgICAgb3JpZW50YXRpb24gPSAiaCIsIAogICAgICB4ID0gLjA1LCAKICAgICAgeSA9IDEuMDQsCiAgICAgIHRpdGxlID0gbGlzdCgKICAgICAgICB0ZXh0ID0gIiIKICAgICAgKQogICAgICApCiAgKQpgYGAKSW4gMTk2MywgdGhlIG1lZGlhbiBvZiB3aGl0ZSBmYW1pbHkgd2VhbHRoIHdhcyBcJDQ3LDY1NCB3aGljaCBpcyAqKjE5LjMgdGltZXMqKiBncmVhdGVyIHRoYW4gdGhlIG1lZGlhbiBvZiBub24td2hpdGUgZmFtaWx5IHdlYWx0aC4gV2hpdGUgbWVkaWFuIGZhbWlseSB3ZWFsdGggd2FzIFwkMTcxLDAwMCBpbiAyMDE2LCB3aGljaCBpcyAqKjkuOCB0aW1lcyoqIGdyZWF0ZXIgdGhhbiBCbGFjayBtZWRpYW4gZmFtaWx5IHdlYWx0aCBvZiAkMTcsNDA5LiBXaGlsZSB0aGUgbWVkaWFuIHdlYWx0aCBnYXAgaGFzIGxlc3NlbmVkIGZyb20gMTk2MyB0byAyMDE2LCBhbmQgaXMgbGVzcyB0aGFuIHRoZSBhdmVyYWdlIGZhbWlseSB3ZWFsdGggZ2FwLCB0aGUgZ2FwIHRyZW5kcyBoYXMgc2hvd24gdG8gYmUgY29uc2lzdGVudCBvdmVyIHRpbWUgYW5kIHRoZSBkaXNwYXJpdGllcyByZW1haW4gc2lnbmlmaWNhbnQuCgojIyMjIEluY29tZSBBbmFseXNpcwoKYGBge3J9CiMgZ2dwbG90KGhvbWVfb3duZXIsIGFlcyh4ID0geWVhciwgeSA9IGhvbWVfb3duZXJfcGN0LCBjb2xvciA9IHJhY2UpKSArCiMgICBnZW9tX2xpbmUoKQpgYGAKCgoqKkxpZmV0aW1lIEVhcm5pbmdzKiogIApUaG9zZSB3aXRoIGxlc3NlciBpbmNvbWVzIG1pZ2h0IGZpbmQgaXQgbW9yZSBkaWZmaWN1bHQgdG8gc2F2ZS4gCjxicj48YnI+CgpgYGB7cn0KCmxpZmV0aW1lX2Vhcm5fcGxvdCA8LSBsaWZldGltZV9lYXJuIHw+IAogIG11dGF0ZSgKICAgIHJhY2UgPSBhc19mYWN0b3IocmFjZSkKICApCgpnZ3Bsb3QobGlmZXRpbWVfZWFybl9wbG90LCBhZXMoeCA9IHJhY2UsIHkgPSBsaWZldGltZV9lYXJuLCBmaWxsID0gcmFjZSkpICsgCiAgZ2VvbV9jb2woKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDMwMDAwMDApLCBicmVha3MgPSBzZXEoMCwgMzAwMDAwMCwgNzUwMDAwKSwgbGFiZWxzID0gbGFiZWxfZG9sbGFyKCkpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgZmFjZXRfd3JhcCh+Z2VuZGVyKSArCiAgbGFicygKICAgIHRpdGxlID0gIkF2ZXJhZ2UgQWNjdW11bGF0ZWQgUmVhbCBMaWZldGltZSBFYXJuaW5ncyBhdCBBZ2VzIDU44oCTNjIgKEJvcm4gMTk1MC01NCkgXG5ieSBHZW5kZXIgYW5kIFJhY2UvRXRobmljaXR5IiwKICAgIHkgPSAiTGlmZXRpbWUgRWFybmluZ3MiCiAgKSArCiAgdGhlbWVfYncoKSArIHRoZW1lKAogICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC44NSkKICApCmBgYAoKVGhlIGF2ZXJhZ2UgbGlmZXRpbWUgaW5jb21lIG9mIGEgd2hpdGUgbWFsZSBpcyBcJDIuNyBtaWxsaW9uLCBjb21wYXJlZCB0byBcJDEuOCBtaWxsaW9uIGZvciBibGFjayBtZW4gYW5kIFwkMi4wIG1pbGxpb24gZm9yIEhpc3BhbmljIG1lbi4gRm9yIHdvbWVuLCB0aGUgZGlzcGFyaXR5IGluIGxpZmV0aW1lIGVhcm5pbmdzIGlzIGxlc3MgcHJvbm91bmNlZDogdGhlIGF2ZXJhZ2Ugd2hpdGUgd29tYW4gbWFrZXMgXCQxLjUgbWlsbGlvbiwgY29tcGFyZWQgdG8gXCQxLjMgbWlsbGlvbiBmb3IgYmxhY2sgd29tZW4gYW5kICQxLjEgbWlsbGlvbiBmb3IgSGlzcGFuaWMgd29tZW4uIFBhcnQgb2YgdGhlc2UgZGlmZmVyZW5jZXMgY2FuIGJlIGF0dHJpYnV0ZWQgdG8gaGlzdG9yaWNhbCBkaXNhZHZhbnRhZ2VzIHRoYXQgc3RpbGwgaGF2ZSBhbiBpbXBhY3Qgb24gZnV0dXJlIGdlbmVyYXRpb25zLgoKCgoKCgoKCgoKCgoKCgoKCgo=